/**
 * 
 */
package com.gxa.hualian.dao;

import com.gxa.hualian.entity.User;

import java.util.List;

/**
 * 接口也可以声明泛型
 * BaseDao作为通用的dao层操作接口,应该只声明通用的方法
 * 例如: selectById(每张表都会带有id字段,规范)
 * 		selectByName(name: 表示特定的某个字段) : selectByName(String name,Object value,Class<T> clazz)
 * 		List<T> selectAll()
 * 		selectLikeName(String name,Object value,Class<T> clazz)
 * 		insert(T t)
 * 		update(Serializable id,T t):  Integer/Long/Object/Serializable
 * 		removeById(Serializable id)
 * 
 * 	反例: selectByPhone(String phone)
 * @author bilei
 * @date 2022年4月15日 
 */
public interface BaseDao<T> {
	
	/**
	 * 
	 * @param id 查询的条件
	 * @param clazz 根据将来指定的泛型类型得到的Class对象
	 * @return
	 * @throws Exception 
	 */
	T selectById(Integer id, Class<T> clazz) throws Exception;

	/**
	 * 根据任意字段查询数据的方法
	 * @param name 目标字段的字段名(name/phone/email)
	 * @param value 字段值
	 * @param clazz 类型
	 * @return 查找到的结果的集合(满足特征的结果,数量是不确定)
	 */
	List<T> selectByName(String name,String value,Class<T> clazz) throws Exception;
	
	/**
	 * 查询全部的对象信息的方法
	 * @param clazz 目标对象的Class类型
	 * @return
	 * @throws Exception 
	 */
	List<T> selectAll(Class<T> clazz) throws Exception;
	
	/**
	 * 向数据库添加对象的通用方法
	 * @param t 被添加的对象
	 * @return
	 * @throws Exception 
	 */
	Integer insert(T t) throws Exception ;
	
	/**
	 * 修改方法
	 * @param
	 * @param t 目标对象
	 * @throws Exception
	 */
	Integer update(String name,Object vlaue, T t) throws Exception;


	/**
	 * 删除方法
	 * @param name 字段名
	 * @param vlaue 值
	 * @param clazz 反射类型
	 * @return 删除的结果,成功返回true,反之返回false
	 * @throws Exception
	 */
	Boolean deleteByName(String name,Object vlaue, Class<T> clazz) throws Exception;

	/**
	 *分页查询的通用方法
	 * @param page 页数
	 * @param limit 每页记录数
	 * @param tClass
	 * @return
	 * @throws Exception
	 */
	 List<T> selectByPage(Integer page, Integer limit, Class<T> tClass) throws Exception;


	/**
	 * 模糊查询
	 * @param value	查询的值
	 * @param clazz 对象
	 * @return
	 * @throws Exception
	 */
	List<T> selectLikeName(Object value, Class<T> clazz) throws Exception;

	/**
	 *
	 * @param phone
	 * @param clazz
	 * @return
	 * @throws Exception
	 */
	T selectByPhone(String phone, Class<T> clazz) throws Exception;

	/**
	 *
	 * @param queryString
	 * @param clazz
	 * @param args
	 * @return
	 */
	List<T> selectByQuery(String queryString,Class<T> clazz,Object... args) throws Exception;

}
